# 闭包 = 内部函数代码 + 自由变量


def func(n):
    print("我是外部函数:{}".format(n))

    def func_in(m):
        nonlocal n  # 5. 声明 n(不可变类型) 不是本地变量 注意:如果自由变量是可变类型 则不需要 nonlocal 声明
        print("我是内部函数:{}".format(m))
        print("我可以使用外部函数的:{}".format(n))    # 4.1 n 被称之为 环境变量/自由变量
        print("我用nonlocal关键字修改自由变量的值:{}".format(n + 1))
    return func_in

# func(4)     # 1. 函数名称是代码空间的引用 func函数返回的是内部函数func_in的引用

f = func(5)  # 2. f 赋值为func的返回值 其返回值为 func_in; 则 f 和 func_in 都是内部函数的引用

# 3. 根据以下报错信息就可以看出 f() 现在就是内部函数;即上述论证 f 与 func_in 都是内部函数的引用 正确
# f()         # TypeError: func_in() missing 1 required positional argument: 'm'

f(6)    # 4. 解析结果: f() == func_in() 内部函数可以直接使用外部函数的变量
# 我是内部函数:6
# 我可以使用外部函数的:5
